<?php

/**
 * Maikuro CMS
 *
 * LICENSE:
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * The license is bundled with this package in the file LICENSE.txt.
 * You may also obtain a copy of the License at this URL:
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *
 * See the License for the specific language governing permissions and
 * limitations under the License.
 *
 * @copyright  Copyright (c) 2010, Jonathan Hedrén
 * @author     Jonathan Hedrén <jonathan.hedren@gmail.com>
 * @license    http://www.apache.org/licenses/LICENSE-2.0 Apache License, Version 2.0
 */

final class SettingsViewController extends AbstractBackendViewController
{
    protected $permissionSubject = 'setting';

    private $settingService;

    public function __construct(BackendApplicationContext $applicationContext, SettingService $settingService)
    {
        parent::__construct($applicationContext);
        $this->settingService = $settingService;
    }

    public function handleRequest(Request $request, Response $response, View $view)
    {
        parent::handleRequest($request, $response, $view);
        
        $this->applicationContext->checkPermission('setting', Constants::ACCESS_LEVEL_VIEW);

        $settingsForm = new SettingsForm();
        $settings = $this->settingService->getSettings();
        foreach ($settings as $setting) {
            $element = new TextFormElement($setting->name, $setting->label);
            $element->setValue($setting->value);
            $settingsForm->setElement($element);
        }

        if ($request->isPost()) {
            $settingsForm->setData($request->getPost());
            if ($settingsForm->isValid()) {
                try {
                    $this->settingService->updateValuesFromArray($settingsForm->getData());

                    $this->settingService->purgeCache();

                    View::getMessenger()->addMessage('Settings saved.');
                    $this->request->redirectTo('settings/');
                } catch (Exception $e) {
                    // Something went wrong!
                    throw $e;
                }
            } else {
                echo 'Form not valid';
            }
        }

        $pageTitle = Translator::translate('Settings');
        $this->view->setVar('title', $pageTitle)
                   ->setVar('settingsForm', $settingsForm)
                   ->setLayout('system')
                   ->render();
    }
}